#ifndef MATRICE_H
#define MATRICE_H

class Point;
class Vecteur;

class Matrice
{
private:
	float data[4][4];

public:
	Matrice();
	Matrice(float *c);
	Matrice(Matrice const& m);
	~Matrice();

	Matrice& operator=(Matrice const& m);

	float getData(int i, int j);
	void setData(int i, int j, float value);

	Matrice loadMatriceNulle();
	Matrice loadIdentite();
	Matrice multiplication(Matrice const& m);
	Matrice operator*(Matrice const& m);
	Vecteur operator*(Vecteur v);
	Point operator*(Point p);

	void createObsGlob(Vecteur w, Vecteur vup,Vecteur v, Point origine);
	void createGlobObs(Vecteur u, Vecteur vup,Vecteur v, Point origine);

	Matrice transposee();

	void translation(float x, float y, float z);
	void translation(float *translation_factor);

	void invTranslation(float x, float y, float z);
	void invTranslation(float *translation_factor);

	Matrice rotationX(float angle);
	Matrice rotationY(float angle);
	Matrice rotationZ(float angle);
	void rotation(float angleX, float angleY, float angleZ);
	void rotation(float *rotation_factor);
	void invRotation(float angleX, float angleY, float angleZ);
	void invRotation(float *rotation_factor);
};

#endif